#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cerrno>
#include <cstring>

int SetnonBlock(int fd)
{
    int fl = fcntl(fd , F_GETFL); //获取文件状态标识符m
    if (fl < 0) return -1;
    fcntl(fd, F_SETFL, fl | O_NONBLOCK); //添加非阻塞属性
}


int main()
{
    SetnonBlock(0);
    char buff[1024];
    while (1)
    {
        errno = 0; //每次重置一下错误码
        ssize_t ret = read(0, buff, sizeof buff - 1);
        if (ret > 0)
        {
            buff[ret -1] = 0;
            //由于我们是通过read调用错误进行判断的，而我们无法判断是否是错误导致的，
            // 因此我们需要判断查看一下errno.
            std::cout << "echo#:" << buff  << " errno : " << errno  << " " << std::strerror(errno) << std::endl;
        } else
        {
            std::cout << "read error" << " errno : " << errno  << " " << std::strerror(errno) << std::endl;
            sleep(1);
        }

        // 对errno 返回的错误码，需要特殊解析，因为这些表示的是：资源未就绪
        if (errno == EWOULDBLOCK || errno == EAGAIN) // EWOULDBLOCK 本质是EAGAIN
        {
            std::cout << "error reason: Resource unavailable" << std::endl;
        }else if (errno  == EINTR) 
        //这个错误比较特殊意思是：该信号被一个信号递达中断，被操作系统唤醒，导致无法重新开始read进而导致失败
        {
            std::cout << "error reasaon: EINTR" << std::endl;
        }
        

    }

    return 0;
}








